package leetcode.editor.cn.dsa03_stack;
//有效括号字符串为空 ("")、"(" + A + ")" 或 A + B，其中 A 和 B 都是有效的括号字符串，+ 代表字符串的连接。例如，""，"()"
//，"(())()" 和 "(()(()))" 都是有效的括号字符串。 
//
// 如果有效字符串 S 非空，且不存在将其拆分为 S = A+B 的方法，我们称其为原语（primitive），其中 A 和 B 都是非空有效括号字符串。 
//
// 给出一个非空有效字符串 S，考虑将其进行原语化分解，使得：S = P_1 + P_2 + ... + P_k，其中 P_i 是有效括号字符串原语。 
//
// 对 S 进行原语化分解，删除分解中每个原语字符串的最外层括号，返回 S 。 
//
// 
//
// 示例 1： 
//
// 输入："(()())(())"
//输出："()()()"
//解释：
//输入字符串为 "(()())(())"，原语化分解得到 "(()())" + "(())"，
//删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。 
//
// 示例 2： 
//
// 输入："(()())(())(()(()))"
//输出："()()()()(())"
//解释：
//输入字符串为 "(()())(())(()(()))"，原语化分解得到 "(()())" + "(())" + "(()(()))"，
//删除每个部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。
// 
//
// 示例 3： 
//
// 输入："()()"
//输出：""
//解释：
//输入字符串为 "()()"，原语化分解得到 "()" + "()"，
//删除每个部分中的最外层括号后得到 "" + "" = ""。
// 
//
// 
//
// 提示： 
//
// 
// S.length <= 10000 
// S[i] 为 "(" 或 ")" 
// S 是一个有效括号字符串 
// 
// Related Topics 栈 
// 👍 142 👎 0

public class RemoveOutermostParentheses1021_4 {
    public static void main(String[] args) {
        Solution solution = new RemoveOutermostParentheses1021_4().new Solution();
        String[] arr = {"(()())(())", "(()())(())(()(()))", "()()"};
        for (int i = 0; i < arr.length; i++) {
            String ret = solution.removeOuterParentheses(arr[i]);
            System.out.println(arr[i] + "====>" + ret);
        }
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String removeOuterParentheses(String str) {
            StringBuilder sb = new StringBuilder();
            //1.定义计数器count，统计左右括号出现的次数
            int count = 0;
            int len = str.length();
            char[] array = str.toCharArray();
            // 2.遍历字符串，根据读取数据进行计数
            for (int i = 0; i < len; i++) {
                char c = array[i];
                if (c == '(') {
                    //3.根据计数情况判断左右括号是否属于原语
                    if(count++ > 0) { // 读取到左括号自增
                        sb.append(c); // 此前有数据，则当前属于原语
                    }
                } else if (--count > 0) { // 读取到右括号自减
                    //3.根据计数情况判断左右括号是否属于原语
                    sb.append(c); // 右括号匹配后仍有数据，则当前属于原语
                }
            }
            //4.将原语拼接到缓冲区并返回
            return sb.toString();
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)
}
